package com.dongdong.service.impl;

import com.dongdong.api.ItemAPI;
import com.dongdong.em.Result;
import com.dongdong.service.CartService;
import com.dongdong.vo.CartVO;
import com.dongdong.vo.DetailVO;
import com.dongdong.vo.ItemVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@Service
public class CartServiceImpl implements CartService {


    @Autowired
    private RedisTemplate redisTemplate;//集合不能转成String   如果要存储集合就不能使用序列化的redis

    @Autowired
    private ItemAPI itemAPI;

    @Override
    public void AddCart(String userid, Integer num, Long skuid) {
        //1.首先去redis中查询购物车
        List<CartVO> redisCartList = getCartVOS(userid);//最大的购物车
        //2.根据skuid查村sku表中的商家名称
        Result<ItemVO> result = itemAPI.getIemBySKUId(skuid);
        ItemVO itemVO = result.getData();
        String seller = itemVO.getSeller();
        //3.判断购物车列表中是否存在当前商家名称的购物车
        CartVO cart = null;//商家列表
        for (CartVO cartVO : redisCartList) {
            if (Objects.equals(cartVO.getSeller(), seller)) {
                //找到了
                cart = cartVO;
                break;//循环每一个购物车列表  找到每一个购物车   获取商家名  比较获取的商品的商家名  找到了就赋值  如果为null就没有找到商家
            }
        }
        //4.没有  就新建一个购物车
        if (cart == null) {
            CartVO cartVO = new CartVO();
            cartVO.setSeller(seller);
            ArrayList<DetailVO> detailVOS = new ArrayList<>();
            DetailVO detailVO = new DetailVO();
            extracted(num, itemVO, detailVO);
            detailVOS.add(detailVO);
            cartVO.setDetailVOS(detailVOS);
            redisCartList.add(cartVO);
        } else {
            //5.有  就判断商家所有的商品明细list集合中是否有新添加进来的sku
            List<DetailVO> detailVOS = cart.getDetailVOS();
            DetailVO detail = null;
            for (DetailVO detailVO : detailVOS) {
                detailVO.getSkuid();
                if (Objects.equals(detailVO.getSkuid(), skuid)) {
                    detail = detailVO;
                    break;
                }
            }
            //不存  没有查询到
            if (detail == null) {
                //创建明细
                //6.没有 创建商品明细把当前sku的商品明细存储进去
                DetailVO detailVO = new DetailVO();
                extracted(num, itemVO, detailVO);
                detailVOS.add(detailVO);
            } else {
                //7.有 修改价格和修改数量
                detail.setNum(detail.getNum() + num);//先修改数量  在修改价格
                detail.setTotalFee(new BigDecimal(detail.getPrice().doubleValue() * detail.getNum()));
                //num数量为0的时候 从明细列表中删除
                if (detail.getNum() <=0 ){
                    detailVOS.remove(detail);
                }
                //当明细列表数量等于0 直接从购物车删除列表
                if (detailVOS.size() == 0){
                    redisCartList.remove(cart);//删除整个购物车
                }
            }
        }
        //8.存入redis
        setRedisCartList(userid, redisCartList);
    }

    private void setRedisCartList(String userid, List<CartVO> vos) {
        redisTemplate.boundHashOps("cartList").put(userid, vos);//根据用户id存储
    }

    private List<CartVO> getCartVOS(String userid) {
        List<CartVO> redisCartList = (List<CartVO>) redisTemplate.boundHashOps("cartList").get(userid);//redis购物车列表
        if (redisCartList == null) {
            redisCartList = new ArrayList<>();
        }
        return redisCartList;
    }

    private void extracted(Integer num, ItemVO itemVO, DetailVO detailVO) {
        detailVO.setNum(num);
        detailVO.setPrice(itemVO.getPrice());
        detailVO.setTitle(itemVO.getTitle());
        detailVO.setSkuid(itemVO.getId());
        detailVO.setPicPath(itemVO.getImage());
        detailVO.setGoodsId(itemVO.getGoodsId());
        detailVO.setTotalFee(new BigDecimal(itemVO.getPrice().doubleValue() * num));
    }

    @Override
    public List<CartVO> getCart(String userid) {
        List<CartVO> cartVOS = getCartVOS(userid);
        return cartVOS;
    }
}
